namespace Аккорд
{
	using System;
	using System.Text;
	using Барс.Ядро;
	using Барс;
	using System.Collections.Generic;

    public struct Период
    {
        private DateTime началоПериода;
        public DateTime НачалоПериода 
        { 
            get { return началоПериода; } 
            set { началоПериода = value; } 
        }

        private DateTime окончаниеПериода;
        public DateTime ОкончаниеПериода
        {
            get { return окончаниеПериода; }
            set { окончаниеПериода = value; }
        }

        private Период(DateTime текущаяДата, ТипПериода типПериода)
        {
            началоПериода = DateTime.MinValue;
            окончаниеПериода = DateTime.MaxValue;

            switch (типПериода)
            {
                case ТипПериода.Произвольно:
                case ТипПериода.Сегодня:
                    НачалоПериода = текущаяДата;
                    ОкончаниеПериода = текущаяДата;
                    break;

                case ТипПериода.Неделя:
                    НачалоПериода = ДатаВремя.НачалоНедели(текущаяДата);
                    ОкончаниеПериода = ДатаВремя.КонецНедели(текущаяДата);
                    break;

                case ТипПериода.Месяц:
                    НачалоПериода = ДатаВремя.НачалоМесяца(текущаяДата);
                    ОкончаниеПериода = ДатаВремя.КонецМесяца(текущаяДата);
                    break;

                case ТипПериода.Квартал:
                    НачалоПериода = ДатаВремя.НачалоКвартала(текущаяДата);
                    ОкончаниеПериода = ДатаВремя.КонецКвартала(текущаяДата);
                    break;

                case ТипПериода.Полугодие:
                    НачалоПериода = ДатаВремя.НачалоПолугодия(текущаяДата);
                    ОкончаниеПериода = ДатаВремя.КонецПолугодия(текущаяДата);
                    break;

                case ТипПериода.Год:
                    НачалоПериода = ДатаВремя.НачалоГода(текущаяДата);
                    ОкончаниеПериода = ДатаВремя.КонецГода(текущаяДата);
                    break;

                case ТипПериода.ПервоеПолугодие:
                    НачалоПериода = ДатаВремя.НачалоПолугодия(1, текущаяДата.Year);
                    ОкончаниеПериода = ДатаВремя.КонецПолугодия(1, текущаяДата.Year);
                    break;

                case ТипПериода.ВтороеПолугодие:
                    НачалоПериода = ДатаВремя.НачалоПолугодия(2, текущаяДата.Year);
                    ОкончаниеПериода = ДатаВремя.КонецПолугодия(2, текущаяДата.Year);
                    break;

                case ТипПериода.ПервыйКвартал:
                    НачалоПериода = ДатаВремя.НачалоКвартала(1, текущаяДата.Year);
                    ОкончаниеПериода = ДатаВремя.КонецКвартала(1, текущаяДата.Year);
                    break;

                case ТипПериода.ВторойКвартал:
                    НачалоПериода = ДатаВремя.НачалоКвартала(2, текущаяДата.Year);
                    ОкончаниеПериода = ДатаВремя.КонецКвартала(2, текущаяДата.Year);
                    break;

                case ТипПериода.ТретийКвартал:
                    НачалоПериода = ДатаВремя.НачалоКвартала(3, текущаяДата.Year);
                    ОкончаниеПериода = ДатаВремя.КонецКвартала(3, текущаяДата.Year);
                    break;

                case ТипПериода.ЧетвертыйКвартал:
                    НачалоПериода = ДатаВремя.НачалоКвартала(4, текущаяДата.Year);
                    ОкончаниеПериода = ДатаВремя.КонецКвартала(4, текущаяДата.Year);
                    break;
            }
        }

        public static Период ПолучитьПериод(DateTime текущаяДата, ТипПериода типПериода)
        {
            return new Период(текущаяДата, типПериода);
        }

        public static bool КорректныйПериод(DateTime началоПериода, DateTime окончаниеПериода)
        {
            return (началоПериода > DateTime.MinValue) && (началоПериода < DateTime.MaxValue) &&
                   (окончаниеПериода > DateTime.MinValue) && (окончаниеПериода < DateTime.MaxValue) &&
                   (окончаниеПериода >= началоПериода);
        }
    }
}
